#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>


#define BUF_SIZE 1024

int main() {
    int pipefd[2];  // 管道文件描述符数组
    pid_t pid;      // 进程ID
    
    printf("=== 进程控制与管道通信实验 ===\n");
    
    // 1. 创建管道
    if (pipe(pipefd) == -1) {
        perror("pipe创建失败");
        exit(1);
    }
    printf("✓ 管道创建成功\n");
    
    // 2. 创建子进程
    pid = fork();
    
    if (pid == -1) {
        perror("fork创建失败");
        exit(1);
    }
    
    if (pid == 0) {
        // 子进程代码区域
        printf("子进程[%d]开始执行\n", getpid());
        
        // 关闭不需要的管道端（子进程只需要写，不需要读）
        close(pipefd[0]);
        
        // 执行ls -l命令，它的输出会被重定向到管道
        printf("子进程准备执行: ls -l\n");
        // 重定向标准输出到管道写端
        // dup2的作用：让文件描述符1(标准输出)指向pipefd[1](管道写端)
        dup2(pipefd[1], STDOUT_FILENO);
        close(pipefd[1]);  // 关闭原始的文件描述符
        
        execlp("ls", "ls", "-l", NULL);
        
        // 如果exec执行成功，下面的代码不会执行
        perror("exec执行失败");
        exit(1);
        
    } else {
        // 父进程代码区域
        printf("父进程[%d]等待子进程[%d]结束\n", getpid(), pid);
        
        // 关闭不需要的管道端（父进程只需要读，不需要写）
        close(pipefd[1]);
        
        // 从管道读取数据并统计
        char buffer[BUF_SIZE];
        int line_count = 0, word_count = 0, char_count = 0;
        int bytes_read;
        int in_word = 0;  // 标记是否在单词中
		int last_char_was_newline = 0;
        
        // 读取管道数据
        while ((bytes_read = read(pipefd[0], buffer, sizeof(buffer)-1)) > 0) {
            buffer[bytes_read] = '\0';  // 添加字符串结束符
            
            // 统计字符、行、单词
            for (int i = 0; i < bytes_read; i++) {
                char_count++;
               char c = buffer[i];
//                // 统计行数（遇到换行符）
//                if (buffer[i] == '\n') {
//                    line_count++;
//                }
				// 统计行数：只有遇到换行符才计数
                if ( c == '\n') {
                    // 避免重复计数连续的换行符
                    if (!last_char_was_newline) {
                        line_count++;
                    }
                    last_char_was_newline = 1;
                } else {
                    last_char_was_newline = 0;
                }
                
                // 统计单词数（遇到空格、换行、制表符等分隔符）
                if (buffer[i] == ' ' || buffer[i] == '\n' || buffer[i] == '\t') {
                    if (in_word) {
                        word_count++;
                        in_word = 0;
                    }
                } else {
                    in_word = 1;
                }
            }
            
            // 打印读取到的数据（可选，用于调试）
            printf("%s", buffer);
        }
        
        // 处理最后一个单词（如果文件不以分隔符结束）
        if (in_word) {
            word_count++;
        }
        
        // 等待子进程结束
        int status;
        wait(&status);
        printf("✓ 子进程结束，退出状态: %d\n", WEXITSTATUS(status));
        
        // 关闭管道读端
        close(pipefd[0]);
        
        // 打印统计结果
        printf("\n=== 统计结果 ===\n");
        printf("行数: %d\n", line_count);
        printf("单词数: %d\n", word_count);
        printf("字符数: %d\n", char_count);
    }
    
    return 0;
}


